Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.07.2019, 15:16
Аспирант
Отправить личное сообщение для Lutsk Посмотреть профиль Найти все сообщения от Lutsk
 
Регистрация: 24.06.2011
Сообщений: 53

Загрузка invisible reСaptcha при повторной отправке ajax
Есть форма. С видимой каптчей работает корректно. Но если использовать невидимую - первая отправка срабатывает корректно, а при повторной отправке выдает ошибку не отмеченной каптчи.
Знания JS у меня посредственные, - пробовал и grecaptcha.reset() где только можно, и grecaptcha.execute() - безрезультатно.
В общем нужна помощь в этом вопросе. Вот код JS:
(function ($) {
	$(document).ready(function () {
		$('body').on('submit', 'form[name="form_ajax"]', function () {
			var form = $(this),
				messages = $(form).find('.messages');
			$.ajax({
				type: 'POST',
				dataType: 'json',
				url: $(form).attr('action'),
				data: $(form).serializeArray(),
				beforeSend: function () {
					$(messages).hide();
					$(messages).find('.message').hide().html('');
				},
				complete: function () {
					if (typeof grecaptcha !== 'undefined' && grecaptcha && grecaptcha.reset) {
						grecaptcha.reset();
					}
				},
				success: function (response) {
					if (response.success) {
						$(messages).find('.message.success').html(response.messages.success.join('<br />')).show();
						$(form)[0].reset();
					}
					else {
						$(messages).show();
						$(messages).find('.message.error').html(response.message.replace(/\n/g, '<br />')).show();
					}
					$(messages).show();
				},
				error: function (response) {
					$(messages).find('.message.error').html(response.status + ':' + response.statusText).show();
					$(messages).show();
				}
			});

			return false;
		});
	});
})(jQuery);
Ответить с цитированием
  #2 (permalink)  
Старый 09.07.2019, 15:39
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Не по поводу вопроса, var form = $(this) - это объект jquery (это же касается и messages = $(form).find('.messages')), следовательно далее не $(form).attr('action'), а form.attr('action'), хотя проще сразу this.action
Ответить с цитированием
  #3 (permalink)  
Старый 09.07.2019, 16:08
Аспирант
Отправить личное сообщение для Lutsk Посмотреть профиль Найти все сообщения от Lutsk
 
Регистрация: 24.06.2011
Сообщений: 53

Сообщение от laimas Посмотреть сообщение
Не по поводу вопроса, var form = $(this) - это объект jquery (это же касается и messages = $(form).find('.messages')), следовательно далее не $(form).attr('action'), а form.attr('action'), хотя проще сразу this.action
Ну это не я писал код. Это я готовое решение нашел и пытаюсь довести до ума.
Уже весь инет перерыл так и не нашел ответа.
Ответить с цитированием
  #4 (permalink)  
Старый 09.07.2019, 20:54
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Lutsk
Уже весь инет перерыл так и не нашел ответа.
А зачем рыть весь интернет, когда достаточно посмотреть документацию! https://developers.google.com/recaptcha/docs/verify

Сообщение от Lutsk
Уже весь инет перерыл так и не нашел ответа.
Всё таки не весь!

Сообщение от Lutsk
Уже весь инет перерыл так и не нашел ответа.
А на английском языке смотрели? А на арабском? А на мандарине? Нет? Ну тогда вы почти и не начинали рыть!

Каждый reCAPTCHA токен верен только на протяжении 2-ух минут, и может быть проверен один раз, что позволяет избежать атак. Поэтому токен следует генерировать перед отправкой формы! Если вам нужен новый токен, вы можете сгенерировать новый токен.


Т. е. вам надо при отправке формы получить токен, записать в форму, отправить её на сервер. Там произвести соответствующий запрос для проверки и в зависимости от результата произвести дальнейшую обработку данных формы.


Ваш пример... Публичный ключ замените на свой...
(function($) {
	var grecaptcha = window.grecaptcha;
	if (!grecaptcha) return alert("reCaptha not found");

	$(function() {
		$("body").on("submit", 'form[name="form_ajax"]', function() {
			var form = $(this),
				messages = $(form).find(".messages");

			$(messages).hide();
			$(messages)
				.find(".message")
				.hide()
				.html("");

			grecaptcha.ready(function() {
				grecaptcha
					.execute("6Levz6wUAAAAAJuGP_hRQKzfXUzwt6Llbk1-vL1y", {
						action: "form"
					})
					.then(function(token) {
						var tokenField = $("input[name=token]");
						if (tokenField.length === 0) {
							form.append('<input type="hidden" name="token">');
						}
						$("input[name=token]").val(token);
					})
					.then(function() {
						$.post(
							form.attr("action"),
							form.serializeArray(),
							function(response) {
								if (response.success) {
									$(messages)
										.find(".message.success")
										.html(response.messages.success.join("<br />"))
										.show();
								} else {
									$(messages).show();
									$(messages)
										.find(".message.error")
										.html(response.message.replace(/\n/g, "<br />"))
										.show();
								}
								$(messages).show();
							},
							"json"
						).fail(function(response) {
							$(messages)
								.find(".message.error")
								.html(response.status + ":" + response.statusText)
								.show();
							$(messages).show();
						});
					});
			});

			return false;
		});
	});
})(jQuery);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка файла на email при помощи Ajax vah-smile AJAX и COMET 6 19.11.2016 16:41
AJAX меняет символы при отправке данных fenix_63 AJAX и COMET 6 17.11.2015 14:20
jQuery - Конфликт функций при отправке формы по ajax Belka AJAX и COMET 5 20.06.2015 02:15
Перестает работать галерея при загрузке через Ajax (Need help) Clodan jQuery 0 20.04.2015 20:18
ajax загрузка HTML содержимого на страницу при выборе определенного select alex162341 jQuery 7 19.10.2014 08:32